#include <linux/input.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
int touch_fd;
struct input_event ts;
// int *p;
// char* p1;
// char* p2;
// char* dp1;
// char* dp2;
// char* dp3;
// char* dp4;
// char* dp5;
// char* dp6;
// char* dp7;
// char* dp8;
// char* dp9;

int* p1;
int* p2;
int* dp1;
int* dp2;
int* dp3;
int* dp4;
int* dp5;
int* dp6;
int* dp7;
int* dp8;
int* dp9;
int event(int *x,int *y)
{
    read(touch_fd,&ts,sizeof(ts));
    if(ts.type == 3 && ts.code == 0)
        *x = ts.value*800/1022;
    if(ts.type == 3 && ts.code == 1)
        *y = ts.value*480/598;
}

int hua(int t_x)
{
    for(int y=400;y<440;y++)//设置进度条的Y轴位置
    {
        for(int x=0;x<800;x++)//设置进度条的长度
        {
            if(t_x>x)//手指滑动的区域
            {
                p1[y*800+x]=0x00000000;
                p1[y*800+x]=0x000000ff;
            }
            // else//手指没有经过的区域
            // {
            //     p[y*800+x]=0x00000000; 
            // }
        }
    }
}//练习：实现滑动解锁，进度条要滑满屏幕，注意不能出现点击触摸屏最右边就解锁成功的问题



int show_bmp(char *bmpname, int* p)
{
    //1.打开液晶屏文件
    int lcdfd = open("/dev/fb0",O_RDWR);
    if(lcdfd == -1)
    {
        printf("打开液晶屏失败\n");
        return 0;
    }
    // 2.打开bmp图片文件
    int bmpfd = open(bmpname,O_RDWR);
    if(bmpfd == -1)
    {
        printf("打开图片失败\n");
        return 0;
    }
    // 内存映射   
    p = mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,lcdfd,0);

    //3.读取bmp图片的数据
    char buf[800*480*3]={0};//800*480:图片像素点总数 *3：C的代码单位是字节
    //跳过表示图片信息的54个字节
    read(bmpfd,buf,54);
    read(bmpfd,buf,800*480*3);
    //添加一个字节
    char bmp[800*480*4]={0};//每个像素点加入一个字节所以大小变成*4
    for(int i=0,j=0;i<800*480*3;i+=3,j+=4)//i+=3:表示每隔RGB加入一个字节,j+=4:表示跳过ARGB
    {
        bmp[j]=buf[i];
        bmp[j+1]=buf[i+1];
        bmp[j+2]=buf[i+2];
        bmp[j+3]=0;
    }

    //4.将读取出来的图片数据写入到液晶屏上
    for(int i=0;i<800*480*4;i++)
    {
       p[i]=bmp[i];
    }
    //write(lcdfd, bmp, 800*480*4);
    // 5.关闭液晶屏文件、bmp图片文件
    // close(lcdfd);
    close(bmpfd);
    return 0;
}


int show_bmp2(char *bmpname, int* p)
{
    //1.打开液晶屏文件
    int lcdfd = open("/dev/fb0",O_RDWR);
    if(lcdfd == -1)
    {
        printf("打开液晶屏失败\n");
        return 0;
    }
    // 2.打开bmp图片文件
    int bmpfd = open(bmpname,O_RDWR);
    if(bmpfd == -1)
    {
        printf("打开图片失败\n");
        return 0;
    }
    // 内存映射   
    p = mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,lcdfd,0);

    //3.读取bmp图片的数据
    char buf[800*480*3]={0};//800*480:图片像素点总数 *3：C的代码单位是字节
    //跳过表示图片信息的54个字节
    read(bmpfd,buf,54);
    read(bmpfd,buf,800*480*3);
    //添加一个字节
    char bmp[800*480*4]={0};//每个像素点加入一个字节所以大小变成*4
    for(int i=0,j=0;i<800*480*3;i+=3,j+=4)//i+=3:表示每隔RGB加入一个字节,j+=4:表示跳过ARGB
    {
        bmp[j]=buf[i];
        bmp[j+1]=buf[i+1];
        bmp[j+2]=buf[i+2];
        bmp[j+3]=0;
    }

    //4.将读取出来的图片数据写入到液晶屏上
    for(int i=0;i<800*480*4;i++)
    {
       p[i]=bmp[i];
    }
    //write(lcdfd, bmp, 800*480*4);
    // 5.关闭液晶屏文件、bmp图片文件
    // close(lcdfd);
    close(bmpfd);
    return 0;
}


int main()
{
    int lcdfd = open("/dev/fb0",O_RDWR);
    if(lcdfd == -1)
    {
        printf("打开液晶屏失败\n");
        return 0;
    }

    touch_fd = open("/dev/input/event0",O_RDWR);
    if(touch_fd == -1)
    {
        printf("打开触摸屏失败\n");
        return -1;
    }
    p1 = mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,lcdfd,0);
    //将屏幕刷黑屏
    // for(int i=0;i<800*480;i++)
    // {
    //     p[i]=0x00000000;
    // }
    close(lcdfd);
    show_bmp("1.bmp", p1);
    int x,y,x1=200,flag=0;
    while(1)
    {
        event(&x,&y);
        if(x<x1)//x1表示区域：0~200 0~400  0~600  0~800 
        {
            hua(x);
            flag=1;//记录每次的区域
        }
        if(x>=x1)//当手指到达下一个区域时，更改下一个区域坐标
        {
            if(flag==1)//只有进入到前一个区域才能解锁下一个区域的坐标
                x1+=200;
            flag=0;
        }
        // if(x>750&&x1>=800)
        // {
        //     printf("解锁成功\n");
        //     // //将屏幕刷黑屏
        //     // for(int i=0;i<800*480;i++)
        //     // {
        //     //     p[i]=0x00000000;
        //     // }
        //     munmap(p,800*480*4);
        //     close(lcdfd);
        //     break;
        // }
        if(x>=750&&x1>=800)
        {
            printf("解锁成功\n");
            break;
        }
        
    }
    munmap(p1,800*480*4);
    close(lcdfd);
    // show_bmp("4.bmp", p2);
    // munmap(p2,800*480*4);
    while (1) {
        show_bmp("d1.bmp", dp1);
        for (int i = 0; i < 100000000/2; i++) {
        }
        show_bmp("d2.bmp", dp2);
        for (int i = 0; i < 100000000/2; i++) {   
        }
        show_bmp("d3.bmp", dp3);
        for (int i = 0; i < 100000000/2; i++) {
        }
        show_bmp("d4.bmp", dp4);
        for (int i = 0; i < 100000000/2; i++) {   
        }
        show_bmp("d5.bmp", dp5);
        for (int i = 0; i < 100000000/2; i++) {
        }
        show_bmp("d6.bmp", dp6);
        for (int i = 0; i < 100000000/2; i++) {   
        }
        show_bmp("d7.bmp", dp7);
        for (int i = 0; i < 100000000/2; i++) {
        }
        show_bmp("d8.bmp", dp8);
        for (int i = 0; i < 100000000/2; i++) {   
        }
        show_bmp("d9.bmp", dp9);
        for (int i = 0; i < 100000000/2; i++) {   
        }
        break;
    }
    show_bmp("4.bmp", p2);
    munmap(p2,800*480*4);
    // munmap(p,800*480*4);
    close(lcdfd);
    close(touch_fd);
    return 0;
}